--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LXMF/LXMessage.py 72932eea28074420defd02b6eb3e5e09a126e4ee (72932eea) Text, 35.18 KB
Tff7b72import T7ee787RNS
Tff7b72import T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787umsgpack Tff7b72as T7ee787msgpack
Tff7b72import T7ee787os
Tff7b72import T7ee787time
Tff7b72import T7ee787base64
Tff7b72import T7ee787multiprocessing
Tff7b72import T7ee787LXMFT7ee787.T7ee787LXStamper Tff7b72as T7ee787LXStamper
Tff7b72from T7ee787.T7ee787LXMF Tff7b72import Te6edf3APP_NAMETb4b4b4, Te6edf3compression_support_from_app_data
Tff7b72class T56d364LXMessageTb4b4b4:
Te6edf3GENERATING Tff7b72= T79c0ff0x00
Te6edf3OUTBOUND Tff7b72= T79c0ff0x01
Te6edf3SENDING Tff7b72= T79c0ff0x02
Te6edf3SENT Tff7b72= T79c0ff0x04
Te6edf3DELIVERED Tff7b72= T79c0ff0x08
Te6edf3REJECTED Tff7b72= T79c0ff0xFD
Te6edf3CANCELLED Tff7b72= T79c0ff0xFE
Te6edf3FAILED Tff7b72= T79c0ff0xFF
Te6edf3states Tff7b72= Tb4b4b4[Te6edf3GENERATINGTb4b4b4, Te6edf3OUTBOUNDTb4b4b4, Te6edf3SENDINGTb4b4b4, Te6edf3SENTTb4b4b4, Te6edf3DELIVEREDTb4b4b4, Te6edf3REJECTEDTb4b4b4, Te6edf3CANCELLEDTb4b4b4, Te6edf3FAILEDTb4b4b4]
Te6edf3UNKNOWN Tff7b72= T79c0ff0x00
Te6edf3PACKET Tff7b72= T79c0ff0x01
Te6edf3RESOURCE Tff7b72= T79c0ff0x02
Te6edf3representations Tff7b72= Tb4b4b4[Te6edf3UNKNOWNTb4b4b4, Te6edf3PACKETTb4b4b4, Te6edf3RESOURCETb4b4b4]
Te6edf3OPPORTUNISTIC Tff7b72= T79c0ff0x01
Te6edf3DIRECT Tff7b72= T79c0ff0x02
Te6edf3PROPAGATED Tff7b72= T79c0ff0x03
Te6edf3PAPER Tff7b72= T79c0ff0x05
Te6edf3valid_methods Tff7b72= Tb4b4b4[Te6edf3OPPORTUNISTICTb4b4b4, Te6edf3DIRECTTb4b4b4, Te6edf3PROPAGATEDTb4b4b4, Te6edf3PAPERTb4b4b4]
Te6edf3SOURCE_UNKNOWN Tff7b72= T79c0ff0x01
Te6edf3SIGNATURE_INVALID Tff7b72= T79c0ff0x02
Te6edf3unverified_reasons Tff7b72= Tb4b4b4[Te6edf3SOURCE_UNKNOWNTb4b4b4, Te6edf3SIGNATURE_INVALIDTb4b4b4]
Te6edf3DESTINATION_LENGTH Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8
Te6edf3SIGNATURE_LENGTH Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8
Te6edf3TICKET_LENGTH Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8
T8b949e# Default ticket expiry is 3 weeks, with an
T8b949e# additional grace period of 5 days, allowing
T8b949e# for timekeeping inaccuracies. Tickets will
T8b949e# automatically renew when there is less than
T8b949e# 14 days to expiry.
Te6edf3TICKET_EXPIRY Tff7b72= T79c0ff21Tff7b72*T79c0ff24Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3TICKET_GRACE Tff7b72= T79c0ff5Tff7b72*T79c0ff24Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3TICKET_RENEW Tff7b72= T79c0ff14Tff7b72*T79c0ff24Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3TICKET_INTERVAL Tff7b72= T79c0ff1Tff7b72*T79c0ff24Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3COST_TICKET Tff7b72= T79c0ff0x100
T8b949e# LXMF overhead is 112 bytes per message:
T8b949e# 16 bytes for destination hash
T8b949e# 16 bytes for source hash
T8b949e# 64 bytes for Ed25519 signature
T8b949e# 8 bytes for timestamp
T8b949e# 8 bytes for msgpack structure
Te6edf3TIMESTAMP_SIZE Tff7b72= T79c0ff8
Te6edf3STRUCT_OVERHEAD Tff7b72= T79c0ff8
Te6edf3LXMF_OVERHEAD Tff7b72= T79c0ff2Tff7b72*Te6edf3DESTINATION_LENGTH Tff7b72+ Te6edf3SIGNATURE_LENGTH Tff7b72+ Te6edf3TIMESTAMP_SIZE Tff7b72+ Te6edf3STRUCT_OVERHEAD
T8b949e# With an MTU of 500, the maximum amount of data
T8b949e# we can send in a single encrypted packet is
T8b949e# 391 bytes.
Te6edf3ENCRYPTED_PACKET_MDU Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffENCRYPTED_MDU Tff7b72+ Te6edf3TIMESTAMP_SIZE
T8b949e# The max content length we can fit in LXMF message
T8b949e# inside a single RNS packet is the encrypted MDU, minus
T8b949e# the LXMF overhead. We can optimise a bit though, by
T8b949e# inferring the destination hash from the destination
T8b949e# field of the packet, therefore we also add the length
T8b949e# of a destination hash to the calculation. With default
T8b949e# RNS and LXMF parameters, the largest single-packet
T8b949e# LXMF message we can send is 295 bytes. If a message
T8b949e# is larger than that, a Reticulum link will be used.
Te6edf3ENCRYPTED_PACKET_MAX_CONTENT Tff7b72= Te6edf3ENCRYPTED_PACKET_MDU Tff7b72- Te6edf3LXMF_OVERHEAD Tff7b72+ Te6edf3DESTINATION_LENGTH
T8b949e# Links can carry a larger MDU, due to less overhead per
T8b949e# packet. The link MDU with default Reticulum parameters
T8b949e# is 431 bytes.
Te6edf3LINK_PACKET_MDU Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffMDU
T8b949e# Which means that we can deliver single-packet LXMF
T8b949e# messages with content of up to 319 bytes over a link.
T8b949e# If a message is larger than that, LXMF will sequence
T8b949e# and transfer it as a RNS resource over the link instead.
Te6edf3LINK_PACKET_MAX_CONTENT Tff7b72= Te6edf3LINK_PACKET_MDU Tff7b72- Te6edf3LXMF_OVERHEAD
T8b949e# For plain packets without encryption, we can
T8b949e# fit up to 368 bytes of content.
Te6edf3PLAIN_PACKET_MDU Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPLAIN_MDU
Te6edf3PLAIN_PACKET_MAX_CONTENT Tff7b72= Te6edf3PLAIN_PACKET_MDU Tff7b72- Te6edf3LXMF_OVERHEAD Tff7b72+ Te6edf3DESTINATION_LENGTH
T8b949e# Descriptive strings regarding transport encryption
Te6edf3ENCRYPTION_DESCRIPTION_AES Tff7b72= Ta5d6ff"Ta5d6ffAES-128Ta5d6ff"
Te6edf3ENCRYPTION_DESCRIPTION_EC Tff7b72= Ta5d6ff"Ta5d6ffCurve25519Ta5d6ff"
Te6edf3ENCRYPTION_DESCRIPTION_UNENCRYPTED Tff7b72= Ta5d6ff"Ta5d6ffUnencryptedTa5d6ff"
T8b949e# Constants for QR/URI encoding LXMs
Te6edf3URI_SCHEMA Tff7b72= Ta5d6ff"Ta5d6fflxmTa5d6ff"
Te6edf3QR_ERROR_CORRECTION Tff7b72= Ta5d6ff"Ta5d6ffERROR_CORRECT_LTa5d6ff"
Te6edf3QR_MAX_STORAGE Tff7b72= T79c0ff2953
Te6edf3PAPER_MDU Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3QR_MAX_STORAGETff7b72-Tb4b4b4(Tffa657lenTb4b4b4(Te6edf3URI_SCHEMATb4b4b4)Tff7b72+Tffa657lenTb4b4b4(Ta5d6ff"Ta5d6ff://Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)Tff7b72*T79c0ff6Tb4b4b4)Tff7b72/Tff7b72/T79c0ff8
Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhash Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff<LXMessage Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff>Ta5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff<LXMessage>Ta5d6ff"
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destinationTb4b4b4, Te6edf3sourceTb4b4b4, Te6edf3content Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3title Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3fields Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3desired_method Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3destination_hash Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3source_hash Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3stamp_costTff7b72=Tff7b72NoneTb4b4b4, Te6edf3include_ticketTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3destinationTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4) Tff7b72or Te6edf3destination Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__destination Tff7b72= Te6edf3destination
Tff7b72if Te6edf3destination Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdestination_hash Tff7b72= Te6edf3destinationTff7b72.Td2a8ffhash
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdestination_hash Tff7b72= Te6edf3destination_hash
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffLXMessage initialised with invalid destinationTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3sourceTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4) Tff7b72or Te6edf3source Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__source Tff7b72= Te6edf3source
Tff7b72if Te6edf3source Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsource_hash Tff7b72= Te6edf3sourceTff7b72.Td2a8ffhash
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsource_hash Tff7b72= Te6edf3source_hash
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffLXMessage initialised with invalid sourceTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3title Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3title Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Tffa657typeTb4b4b4(Te6edf3titleTb4b4b4) Tff7b72== Tffa657bytesTb4b4b4: Tff7b72selfTff7b72.Td2a8ffset_title_from_bytesTb4b4b4(Te6edf3titleTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffset_title_from_stringTb4b4b4(Te6edf3titleTb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3contentTb4b4b4) Tff7b72== Tffa657bytesTb4b4b4: Tff7b72selfTff7b72.Td2a8ffset_content_from_bytesTb4b4b4(Te6edf3contentTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffset_content_from_stringTb4b4b4(Te6edf3contentTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffset_fieldsTb4b4b4(Te6edf3fieldsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpayload Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftimestamp Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffsignature Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffhash Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftransient_id Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpacked Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffauto_compress Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffGENERATING
Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffUNKNOWN
Tff7b72selfTff7b72.Td2a8ffprogress Tff7b72= T79c0ff0.0
Tff7b72selfTff7b72.Td2a8ffrssi Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffsnr Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffq Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstamp Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstamp_cost Tff7b72= Te6edf3stamp_cost
Tff7b72selfTff7b72.Td2a8ffstamp_value Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstamp_valid Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffstamp_checked Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffpropagation_stamp Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpropagation_stamp_value Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpropagation_stamp_valid Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffpropagation_target_cost Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffdefer_stamp Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffdefer_propagation_stamp Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffoutbound_ticket Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffinclude_ticket Tff7b72= Te6edf3include_ticket
Tff7b72selfTff7b72.Td2a8ffpropagation_packed Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpaper_packed Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffincoming Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffsignature_validated Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffunverified_reason Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffratchet_id Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffUNKNOWN
Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72= Te6edf3desired_method
Tff7b72selfTff7b72.Td2a8ffdelivery_attempts Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffratchet_id Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpacket_representation Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffresource_representation Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff__delivery_destination Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff__delivery_callback Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff__pn_encrypted_data Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fffailed_callback Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffdeferred_stamp_generating Tff7b72= Tff7b72False
Tff7b72def Td2a8ffset_title_from_stringTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3title_stringTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftitle Tff7b72= Te6edf3title_stringTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffset_title_from_bytesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3title_bytesTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftitle Tff7b72= Te6edf3title_bytes
Tff7b72def Td2a8fftitle_as_stringTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8fftitleTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffset_content_from_stringTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3content_stringTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcontent Tff7b72= Te6edf3content_stringTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffset_content_from_bytesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3content_bytesTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcontent Tff7b72= Te6edf3content_bytes
Tff7b72def Td2a8ffcontent_as_stringTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffcontentTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff could not decode message content as string: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffset_fieldsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3fieldsTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3fieldsTb4b4b4, Tffa657dictTb4b4b4) Tff7b72or Te6edf3fields Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fffields Tff7b72= Te6edf3fields Tff7b72or Tb4b4b4{Tb4b4b4}
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffLXMessage property Tffea00\"Ta5d6fffieldsTffea00\"Ta5d6ff can only be dict or NoneTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffget_fieldsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8fffields
Tf0883e@property
Tff7b72def Td2a8ffdestinationTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__destination
Tf0883e@destinationTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffdestinationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destinationTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffset_destinationTb4b4b4(Te6edf3destinationTb4b4b4)
Tff7b72def Td2a8ffget_destinationTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdestination
Tff7b72def Td2a8ffset_destinationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destinationTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3destinationTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__destination Tff7b72= Te6edf3destination
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination set on LXMessageTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCannot reassign destination on LXMessageTa5d6ff"Tb4b4b4)
Tf0883e@property
Tff7b72def Td2a8ffsourceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__source
Tf0883e@sourceTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffsourceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sourceTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffset_sourceTb4b4b4(Te6edf3sourceTb4b4b4)
Tff7b72def Td2a8ffget_sourceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffsource
Tff7b72def Td2a8ffset_sourceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sourceTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsource Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3sourceTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__source Tff7b72= Te6edf3source
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid source set on LXMessageTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCannot reassign source on LXMessageTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffset_delivery_destinationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3delivery_destinationTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_destination Tff7b72= Te6edf3delivery_destination
Tff7b72def Td2a8ffregister_delivery_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_callback Tff7b72= Te6edf3callback
Tff7b72def Td2a8ffregister_failed_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fffailed_callback Tff7b72= Te6edf3callback
Tff7b72def Td2a8ffvalidate_stampTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3target_costTb4b4b4, Te6edf3ticketsTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3tickets Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72for Te6edf3ticket Tff7b72in Te6edf3ticketsTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstamp Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fftruncated_hashTb4b4b4(Te6edf3ticketTff7b72+Tff7b72selfTff7b72.Td2a8ffmessage_idTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffStamp on Tffd700{Tff7b72selfTffd700}Ta5d6ff validated by inbound ticketTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) T8b949e# TODO: Remove at some point
Tff7b72selfTff7b72.Td2a8ffstamp_value Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffCOST_TICKET
Tff7b72return Tff7b72True
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while validating ticket: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstamp Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Te6edf3workblock Tff7b72= Te6edf3LXStamperTff7b72.Td2a8ffstamp_workblockTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessage_idTb4b4b4)
Tff7b72if Te6edf3LXStamperTff7b72.Td2a8ffstamp_validTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstampTb4b4b4, Te6edf3target_costTb4b4b4, Te6edf3workblockTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffStamp on Tffd700{Tff7b72selfTffd700}Ta5d6ff validatedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) T8b949e# TODO: Remove at some point
Tff7b72selfTff7b72.Td2a8ffstamp_value Tff7b72= Te6edf3LXStamperTff7b72.Td2a8ffstamp_valueTb4b4b4(Te6edf3workblockTb4b4b4, Tff7b72selfTff7b72.Td2a8ffstampTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffget_stampTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e# If an outbound ticket exists, use this for
T8b949e# generating a valid stamp.
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_ticket Tff7b72!= Tff7b72None Tff7b72and Tffa657typeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_ticketTb4b4b4) Tff7b72== Tffa657bytes Tff7b72and Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_ticketTb4b4b4) Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffTICKET_LENGTHTb4b4b4:
Te6edf3generated_stamp Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fftruncated_hashTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_ticketTff7b72+Tff7b72selfTff7b72.Td2a8ffmessage_idTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstamp_value Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffCOST_TICKET
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffGenerated stamp with outbound ticket Tffd700{Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_ticketTb4b4b4)Tffd700}Ta5d6ff for Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) T8b949e# TODO: Remove at some point
Tff7b72return Te6edf3generated_stamp
T8b949e# If no stamp cost is required, we can just
T8b949e# return immediately.
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffstamp_cost Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstamp_value Tff7b72= Tff7b72None
Tff7b72return Tff7b72None
T8b949e# If a stamp was already generated, return
T8b949e# it immediately.
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffstamp Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffstamp
T8b949e# Otherwise, we will need to generate a
T8b949e# valid stamp according to the cost that
T8b949e# the receiver has specified.
Tff7b72elseTb4b4b4:
Te6edf3generated_stampTb4b4b4, Te6edf3value Tff7b72= Te6edf3LXStamperTff7b72.Td2a8ffgenerate_stampTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessage_idTb4b4b4, Tff7b72selfTff7b72.Td2a8ffstamp_costTb4b4b4)
Tff7b72if Te6edf3generated_stampTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstamp_value Tff7b72= Te6edf3value
Tff7b72selfTff7b72.Td2a8ffstamp_valid Tff7b72= Tff7b72True
Tff7b72return Te6edf3generated_stamp
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffget_propagation_stampTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3target_costTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e# If a stamp was already generated, return
T8b949e# it immediately.
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpropagation_stamp Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffpropagation_stamp
T8b949e# Otherwise, we will need to generate a
T8b949e# valid stamp according to the cost that
T8b949e# the propagation node has specified.
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpropagation_target_cost Tff7b72= Te6edf3target_cost
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpropagation_target_cost Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCannot generate propagation stamp without configured target propagation costTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fftransient_idTb4b4b4: Tff7b72selfTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3generated_stampTb4b4b4, Te6edf3value Tff7b72= Te6edf3LXStamperTff7b72.Td2a8ffgenerate_stampTb4b4b4(Tff7b72selfTff7b72.Td2a8fftransient_idTb4b4b4, Te6edf3target_costTb4b4b4, Te6edf3expand_roundsTff7b72=Te6edf3LXStamperTff7b72.Td2a8ffWORKBLOCK_EXPAND_ROUNDS_PNTb4b4b4)
Tff7b72if Te6edf3generated_stampTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpropagation_stamp Tff7b72= Te6edf3generated_stamp
Tff7b72selfTff7b72.Td2a8ffpropagation_stamp_value Tff7b72= Te6edf3value
Tff7b72selfTff7b72.Td2a8ffpropagation_stamp_valid Tff7b72= Tff7b72True
Tff7b72return Te6edf3generated_stamp
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffpackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3payload_updatedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftimestamp Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8fftimestamp Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_packed Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpaper_packed Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpayload Tff7b72= Tb4b4b4[Tff7b72selfTff7b72.Td2a8fftimestampTb4b4b4, Tff7b72selfTff7b72.Td2a8fftitleTb4b4b4, Tff7b72selfTff7b72.Td2a8ffcontentTb4b4b4, Tff7b72selfTff7b72.Td2a8fffieldsTb4b4b4]
Te6edf3hashed_part Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3hashed_part Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8ffhash
Te6edf3hashed_part Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ff__sourceTff7b72.Td2a8ffhash
Te6edf3hashed_part Tff7b72+Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpayloadTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3hashed_partTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_id Tff7b72= Tff7b72selfTff7b72.Td2a8ffhash
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffdefer_stampTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstamp Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_stampTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstamp Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffpayloadTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstampTb4b4b4)
Te6edf3signed_part Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3signed_part Tff7b72+Tff7b72= Te6edf3hashed_part
Te6edf3signed_part Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffhash
Tff7b72selfTff7b72.Td2a8ffsignature Tff7b72= Tff7b72selfTff7b72.Td2a8ff__sourceTff7b72.Td2a8ffsignTb4b4b4(Te6edf3signed_partTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsignature_validated Tff7b72= Tff7b72True
Te6edf3packed_payload Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpayloadTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpacked Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffpacked Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8ffhash
Tff7b72selfTff7b72.Td2a8ffpacked Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ff__sourceTff7b72.Td2a8ffhash
Tff7b72selfTff7b72.Td2a8ffpacked Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsignature
Tff7b72selfTff7b72.Td2a8ffpacked Tff7b72+Tff7b72= Te6edf3packed_payload
Tff7b72selfTff7b72.Td2a8ffpacked_size Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4)
Te6edf3content_size Tff7b72= Tffa657lenTb4b4b4(Te6edf3packed_payloadTb4b4b4)Tff7b72-Te6edf3LXMessageTff7b72.Td2a8ffTIMESTAMP_SIZETff7b72-Te6edf3LXMessageTff7b72.Td2a8ffSTRUCT_OVERHEAD
T8b949e# If no desired delivery method has been defined,
T8b949e# one will be chosen according to these rules:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffDIRECT
T8b949e# If opportunistic delivery was requested, check
T8b949e# that message will fit within packet size limits
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffOPPORTUNISTICTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Tff7b72if Te6edf3content_size Tff7b72> Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTED_PACKET_MAX_CONTENTTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffOpportunistic delivery was requested for Tffd700{Tff7b72selfTffd700}Ta5d6ff, but content of length Tffd700{Te6edf3content_sizeTffd700}Ta5d6ff exceeds packet size limit. Falling back to link-based delivery.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffDIRECT
T8b949e# Set delivery parameters according to delivery method
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffOPPORTUNISTICTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Te6edf3single_packet_content_limit Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTED_PACKET_MAX_CONTENT
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAINTb4b4b4:
Te6edf3single_packet_content_limit Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffPLAIN_PACKET_MAX_CONTENT
Tff7b72if Te6edf3content_size Tff7b72> Te6edf3single_packet_content_limitTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLXMessage desired opportunistic delivery method, but content of length Tffd700{Te6edf3content_sizeTffd700}Ta5d6ff exceeds single-packet content limit of Tffd700{Te6edf3single_packet_content_limitTffd700}Ta5d6ff.Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffOPPORTUNISTIC
Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffPACKET
Tff7b72selfTff7b72.Td2a8ff__delivery_destination Tff7b72= Tff7b72selfTff7b72.Td2a8ff__destination
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDIRECTTb4b4b4:
Te6edf3single_packet_content_limit Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffLINK_PACKET_MAX_CONTENT
Tff7b72if Te6edf3content_size Tff7b72<Tff7b72= Te6edf3single_packet_content_limitTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72= Tff7b72selfTff7b72.Td2a8ffdesired_method
Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffPACKET
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72= Tff7b72selfTff7b72.Td2a8ffdesired_method
Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffRESOURCE
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPROPAGATEDTb4b4b4:
Te6edf3single_packet_content_limit Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffLINK_PACKET_MAX_CONTENT
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__pn_encrypted_data Tff7b72== Tff7b72None Tff7b72or Te6edf3payload_updatedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__pn_encrypted_data Tff7b72= Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8ffencryptTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4[Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffratchet_id Tff7b72= Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fflatest_ratchet_id
Te6edf3lxmf_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4[Tb4b4b4:Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4]Tff7b72+Tff7b72selfTff7b72.Td2a8ff__pn_encrypted_data
Tff7b72selfTff7b72.Td2a8fftransient_id Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3lxmf_dataTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpropagation_stamp Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3lxmf_data Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffpropagation_stamp
Tff7b72selfTff7b72.Td2a8ffpropagation_packed Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4[Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4[Te6edf3lxmf_dataTb4b4b4]Tb4b4b4]Tb4b4b4)
Te6edf3content_size Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_packedTb4b4b4)
Tff7b72if Te6edf3content_size Tff7b72<Tff7b72= Te6edf3single_packet_content_limitTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72= Tff7b72selfTff7b72.Td2a8ffdesired_method
Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffPACKET
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72= Tff7b72selfTff7b72.Td2a8ffdesired_method
Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffRESOURCE
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPAPERTb4b4b4:
Te6edf3paper_content_limit Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffPAPER_MDU
Te6edf3encrypted_data Tff7b72= Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8ffencryptTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4[Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffratchet_id Tff7b72= Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fflatest_ratchet_id
Tff7b72selfTff7b72.Td2a8ffpaper_packed Tff7b72= Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4[Tb4b4b4:Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4]Tff7b72+Te6edf3encrypted_data
Te6edf3content_size Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpaper_packedTb4b4b4)
Tff7b72if Te6edf3content_size Tff7b72<Tff7b72= Te6edf3paper_content_limitTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72= Tff7b72selfTff7b72.Td2a8ffdesired_method
Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffPAPER
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffLXMessage desired paper delivery method, but content exceeds paper message maximum size.Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to re-pack LXMessage Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff that was already packedTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffsendTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdetermine_transport_encryptionTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdetermine_compression_supportTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffOPPORTUNISTICTb4b4b4:
Te6edf3lxm_packet Tff7b72= Tff7b72selfTff7b72.Td2a8ff__as_packetTb4b4b4(Tb4b4b4)
Te6edf3lxm_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffset_delivery_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__mark_deliveredTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprogress Tff7b72= T79c0ff0.50
Tff7b72selfTff7b72.Td2a8ffratchet_id Tff7b72= Te6edf3lxm_packetTff7b72.Td2a8ffratchet_id
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffSENT
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDIRECTTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffSENDING
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPACKETTb4b4b4:
Te6edf3lxm_packet Tff7b72= Tff7b72selfTff7b72.Td2a8ff__as_packetTb4b4b4(Tb4b4b4)
Te6edf3receipt Tff7b72= Te6edf3lxm_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffratchet_id Tff7b72= Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTff7b72.Td2a8fflink_id
Tff7b72if Te6edf3receiptTb4b4b4:
Te6edf3receiptTff7b72.Td2a8ffset_delivery_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__mark_deliveredTb4b4b4)
Te6edf3receiptTff7b72.Td2a8ffset_timeout_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__link_packet_timed_outTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprogress Tff7b72= T79c0ff0.50
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffRESOURCETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffresource_representation Tff7b72= Tff7b72selfTff7b72.Td2a8ff__as_resourceTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffratchet_id Tff7b72= Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTff7b72.Td2a8fflink_id
Tff7b72selfTff7b72.Td2a8ffprogress Tff7b72= T79c0ff0.10
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPROPAGATEDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffSENDING
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPACKETTb4b4b4:
Te6edf3receipt Tff7b72= Tff7b72selfTff7b72.Td2a8ff__as_packetTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3receiptTb4b4b4:
Te6edf3receiptTff7b72.Td2a8ffset_delivery_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__mark_propagatedTb4b4b4)
Te6edf3receiptTff7b72.Td2a8ffset_timeout_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__link_packet_timed_outTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprogress Tff7b72= T79c0ff0.50
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffRESOURCETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffresource_representation Tff7b72= Tff7b72selfTff7b72.Td2a8ff__as_resourceTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprogress Tff7b72= T79c0ff0.10
Tff7b72def Td2a8ffdetermine_compression_supportTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3app_data Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecall_app_dataTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)
Tff7b72if Te6edf3app_dataTb4b4b4: Tff7b72selfTff7b72.Td2a8ffauto_compress Tff7b72= Te6edf3compression_support_from_app_dataTb4b4b4(Te6edf3app_dataTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffauto_compress Tff7b72= Tff7b72True
T8b949e###### TODO: Remove debug logging
Tff7b72if Te6edf3app_dataTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSet compression support from app data to: Tffd700{Tff7b72selfTff7b72.Td2a8ffauto_compressTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDefaulting compression support to Tffd700{Tff7b72selfTff7b72.Td2a8ffauto_compressTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
T8b949e######
Tff7b72def Td2a8ffdetermine_transport_encryptionTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# TODO: These descriptions are old and outdated.
T8b949e# Update the transport encryption descriptions to
T8b949e# account for ratchets and other changes.
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffOPPORTUNISTICTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_EC
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffGROUPTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_AES
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_UNENCRYPTED
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDIRECTTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_EC
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPROPAGATEDTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_EC
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffGROUPTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_AES
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_UNENCRYPTED
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPAPERTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_EC
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffGROUPTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_AES
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_UNENCRYPTED
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_UNENCRYPTED
Tff7b72def Td2a8ff__mark_deliveredTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3receipt Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReceived delivery notification for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffDELIVERED
Tff7b72selfTff7b72.Td2a8ffprogress Tff7b72= T79c0ff1.0
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__delivery_callback Tff7b72!= Tff7b72None Tff7b72and Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__delivery_callbackTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_callbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred in the external delivery callback for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72def Td2a8ff__mark_propagatedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3receipt Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReceived propagation success notification for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffSENT
Tff7b72selfTff7b72.Td2a8ffprogress Tff7b72= T79c0ff1.0
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__delivery_callback Tff7b72!= Tff7b72None Tff7b72and Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__delivery_callbackTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_callbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred in the external delivery callback for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72def Td2a8ff__mark_paper_generatedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3receipt Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPaper message generation succeeded for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffPAPER
Tff7b72selfTff7b72.Td2a8ffprogress Tff7b72= T79c0ff1.0
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__delivery_callback Tff7b72!= Tff7b72None Tff7b72and Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__delivery_callbackTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_callbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred in the external delivery callback for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72def Td2a8ff__resource_concludedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__mark_deliveredTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffREJECTEDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffREJECTED
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffstate Tff7b72!= Te6edf3LXMessageTff7b72.Td2a8ffCANCELLEDTb4b4b4:
Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffOUTBOUND
Tff7b72def Td2a8ff__propagation_resource_concludedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__mark_propagatedTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstate Tff7b72!= Te6edf3LXMessageTff7b72.Td2a8ffCANCELLEDTb4b4b4:
Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffOUTBOUND
Tff7b72def Td2a8ff__link_packet_timed_outTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3packet_receiptTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstate Tff7b72!= Te6edf3LXMessageTff7b72.Td2a8ffCANCELLEDTb4b4b4:
Tff7b72if Te6edf3packet_receiptTb4b4b4:
Te6edf3packet_receiptTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffOUTBOUND
Tff7b72def Td2a8ff__update_transfer_progressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprogress Tff7b72= T79c0ff0.10 Tff7b72+ Tb4b4b4(Te6edf3resourceTff7b72.Td2a8ffget_progressTb4b4b4(Tb4b4b4)Tff7b72*T79c0ff0.90Tb4b4b4)
Tff7b72def Td2a8ff__as_packetTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCanTa5d6ff'Ta5d6fft synthesize packet for LXMF message before delivery destination is knownTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffOPPORTUNISTICTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4, Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4[Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDIRECTTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4, Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPROPAGATEDTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4, Tff7b72selfTff7b72.Td2a8ffpropagation_packedTb4b4b4)
Tff7b72def Td2a8ff__as_resourceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCanTa5d6ff'Ta5d6fft synthesize resource for LXMF message before delivery destination is knownTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffLINKTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffTried to synthesize resource for LXMF message on a delivery destination that was not a linkTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Tff7b72raise Tf85149ConnectionErrorTb4b4b4(Ta5d6ff"Ta5d6ffTried to synthesize resource for LXMF message on a link that was not activeTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDIRECTTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4, Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4, Te6edf3callback Tff7b72= Tff7b72selfTff7b72.Td2a8ff__resource_concludedTb4b4b4, Te6edf3progress_callback Tff7b72= Tff7b72selfTff7b72.Td2a8ff__update_transfer_progressTb4b4b4, Te6edf3auto_compressTff7b72=Tff7b72selfTff7b72.Td2a8ffauto_compressTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPROPAGATEDTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_packedTb4b4b4, Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4, Te6edf3callback Tff7b72= Tff7b72selfTff7b72.Td2a8ff__propagation_resource_concludedTb4b4b4, Te6edf3progress_callback Tff7b72= Tff7b72selfTff7b72.Td2a8ff__update_transfer_progressTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffpacked_containerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3container Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffstateTb4b4b4,
Ta5d6ff"Ta5d6fflxmf_bytesTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4,
Ta5d6ff"Ta5d6fftransport_encryptedTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8fftransport_encryptedTb4b4b4,
Ta5d6ff"Ta5d6fftransport_encryptionTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8fftransport_encryptionTb4b4b4,
Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffmethod
Tb4b4b4}
Tff7b72return Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3containerTb4b4b4)
Tff7b72def Td2a8ffwrite_to_directoryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3directory_pathTb4b4b4)Tb4b4b4:
Te6edf3file_name Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3file_path Tff7b72= Te6edf3directory_pathTff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3file_name
Tff7b72tryTb4b4b4:
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpacked_containerTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3file_path
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while writing LXMF message to file Tffea00\"Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3file_pathTb4b4b4)Tff7b72+Ta5d6ff"Tffea00\"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffas_uriTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3finaliseTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPAPER Tff7b72and Tff7b72selfTff7b72.Td2a8ffpaper_packed Tff7b72!= Tff7b72NoneTb4b4b4:
T8b949e# Encode packed LXM with URL-safe base64 and remove padding
Te6edf3encoded_bytes Tff7b72= Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64encodeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpaper_packedTb4b4b4)
T8b949e# Add protocol specifier and return
Te6edf3lxm_uri Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffURI_SCHEMATff7b72+Ta5d6ff"Ta5d6ff://Ta5d6ff"Tff7b72+Te6edf3encoded_bytesTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff=Ta5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3finaliseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdetermine_transport_encryptionTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__mark_paper_generatedTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3lxm_uri
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to represent LXM with non-paper delivery method as URITa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffas_qrTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPAPER Tff7b72and Tff7b72selfTff7b72.Td2a8ffpaper_packed Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72import T7ee787importlib
Tff7b72if Te6edf3importlibTff7b72.Td2a8ffutilTff7b72.Td2a8fffind_specTb4b4b4(Ta5d6ff'Ta5d6ffqrcodeTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72import T7ee787qrcode
Te6edf3qr Tff7b72= Te6edf3qrcodeTff7b72.Td2a8ffmakeTb4b4b4(
Te6edf3error_correction Tff7b72= Te6edf3qrcodeTff7b72.Td2a8ffconstantsTff7b72.Td2a8ff__dict__Tb4b4b4[Te6edf3LXMessageTff7b72.Td2a8ffQR_ERROR_CORRECTIONTb4b4b4]Tb4b4b4,
Te6edf3border Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8ffas_uriTb4b4b4(Te6edf3finaliseTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdetermine_transport_encryptionTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__mark_paper_generatedTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3qr
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffGenerating QR-code representanions of LXMs requires the Tffea00\"Ta5d6ffqrcodeTffea00\"Ta5d6ff module to be installed.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICALTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffYou can install it with the command: python3 -m pip install qrcodeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICALTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to represent LXM with non-paper delivery method as QR-codeTa5d6ff"Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffunpack_from_bytesTb4b4b4(Te6edf3lxmf_bytesTb4b4b4, Te6edf3original_method Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3destination_hash Tff7b72= Te6edf3lxmf_bytesTb4b4b4[Tb4b4b4:Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4]
Te6edf3source_hash Tff7b72= Te6edf3lxmf_bytesTb4b4b4[Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4:T79c0ff2Tff7b72*Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4]
Te6edf3signature Tff7b72= Te6edf3lxmf_bytesTb4b4b4[T79c0ff2Tff7b72*Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4:T79c0ff2Tff7b72*Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTff7b72+Te6edf3LXMessageTff7b72.Td2a8ffSIGNATURE_LENGTHTb4b4b4]
Te6edf3packed_payload Tff7b72= Te6edf3lxmf_bytesTb4b4b4[T79c0ff2Tff7b72*Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTff7b72+Te6edf3LXMessageTff7b72.Td2a8ffSIGNATURE_LENGTHTb4b4b4:Tb4b4b4]
Te6edf3unpacked_payload Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3packed_payloadTb4b4b4)
T8b949e# Extract stamp from payload if included
Tff7b72if Tffa657lenTb4b4b4(Te6edf3unpacked_payloadTb4b4b4) Tff7b72> T79c0ff4Tb4b4b4:
Te6edf3stamp Tff7b72= Te6edf3unpacked_payloadTb4b4b4[T79c0ff4Tb4b4b4]
Te6edf3unpacked_payload Tff7b72= Te6edf3unpacked_payloadTb4b4b4[Tb4b4b4:T79c0ff4Tb4b4b4]
Te6edf3packed_payload Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3unpacked_payloadTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3stamp Tff7b72= Tff7b72None
Te6edf3hashed_part Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff" Tff7b72+ Te6edf3destination_hash Tff7b72+ Te6edf3source_hash Tff7b72+ Te6edf3packed_payload
Te6edf3message_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3hashed_partTb4b4b4)
Te6edf3signed_part Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff" Tff7b72+ Te6edf3hashed_part Tff7b72+ Te6edf3message_hash
Te6edf3timestamp Tff7b72= Te6edf3unpacked_payloadTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3title_bytes Tff7b72= Te6edf3unpacked_payloadTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3content_bytes Tff7b72= Te6edf3unpacked_payloadTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3fields Tff7b72= Te6edf3unpacked_payloadTb4b4b4[T79c0ff3Tb4b4b4]
Te6edf3destination_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3destination_identity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3destination_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffdeliveryTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3destination Tff7b72= Tff7b72None
Te6edf3source_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3source_hashTb4b4b4)
Tff7b72if Te6edf3source_identity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3source Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3source_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffdeliveryTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3source Tff7b72= Tff7b72None
Te6edf3message Tff7b72= Te6edf3LXMessageTb4b4b4(
Te6edf3destination Tff7b72= Te6edf3destinationTb4b4b4,
Te6edf3source Tff7b72= Te6edf3sourceTb4b4b4,
Te6edf3content Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3title Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3fields Tff7b72= Te6edf3fieldsTb4b4b4,
Te6edf3destination_hash Tff7b72= Te6edf3destination_hashTb4b4b4,
Te6edf3source_hash Tff7b72= Te6edf3source_hashTb4b4b4,
Te6edf3desired_method Tff7b72= Te6edf3original_methodTb4b4b4)
Te6edf3messageTff7b72.Td2a8ffhash Tff7b72= Te6edf3message_hash
Te6edf3messageTff7b72.Td2a8ffmessage_id Tff7b72= Te6edf3messageTff7b72.Td2a8ffhash
Te6edf3messageTff7b72.Td2a8ffsignature Tff7b72= Te6edf3signature
Te6edf3messageTff7b72.Td2a8ffstamp Tff7b72= Te6edf3stamp
Te6edf3messageTff7b72.Td2a8ffincoming Tff7b72= Tff7b72True
Te6edf3messageTff7b72.Td2a8fftimestamp Tff7b72= Te6edf3timestamp
Te6edf3messageTff7b72.Td2a8ffpacked Tff7b72= Te6edf3lxmf_bytes
Te6edf3messageTff7b72.Td2a8ffpacked_size Tff7b72= Tffa657lenTb4b4b4(Te6edf3lxmf_bytesTb4b4b4)
Te6edf3messageTff7b72.Td2a8ffset_title_from_bytesTb4b4b4(Te6edf3title_bytesTb4b4b4)
Te6edf3messageTff7b72.Td2a8ffset_content_from_bytesTb4b4b4(Te6edf3content_bytesTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3sourceTb4b4b4:
Tff7b72if Te6edf3sourceTff7b72.Td2a8ffidentityTff7b72.Td2a8ffvalidateTb4b4b4(Te6edf3signatureTb4b4b4, Te6edf3signed_partTb4b4b4)Tb4b4b4:
Te6edf3messageTff7b72.Td2a8ffsignature_validated Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3messageTff7b72.Td2a8ffsignature_validated Tff7b72= Tff7b72False
Te6edf3messageTff7b72.Td2a8ffunverified_reason Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffSIGNATURE_INVALID
Tff7b72elseTb4b4b4:
Te6edf3signature_validated Tff7b72= Tff7b72False
Te6edf3messageTff7b72.Td2a8ffunverified_reason Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffSOURCE_UNKNOWN
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffUnpacked LXMF message signature could not be validated, since source identity is unknownTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3messageTff7b72.Td2a8ffsignature_validated Tff7b72= Tff7b72False
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while validating LXMF message signature. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Te6edf3message
Tf0883e@staticmethod
Tff7b72def Td2a8ffunpack_from_fileTb4b4b4(Te6edf3lxmf_file_handleTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3container Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3lxmf_file_handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3lxm Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffunpack_from_bytesTb4b4b4(Te6edf3containerTb4b4b4[Ta5d6ff"Ta5d6fflxmf_bytesTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffstateTa5d6ff" Tff7b72in Te6edf3containerTb4b4b4:
Te6edf3lxmTff7b72.Td2a8ffstate Tff7b72= Te6edf3containerTb4b4b4[Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6fftransport_encryptedTa5d6ff" Tff7b72in Te6edf3containerTb4b4b4:
Te6edf3lxmTff7b72.Td2a8fftransport_encrypted Tff7b72= Te6edf3containerTb4b4b4[Ta5d6ff"Ta5d6fftransport_encryptedTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6fftransport_encryptionTa5d6ff" Tff7b72in Te6edf3containerTb4b4b4:
Te6edf3lxmTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3containerTb4b4b4[Ta5d6ff"Ta5d6fftransport_encryptionTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffmethodTa5d6ff" Tff7b72in Te6edf3containerTb4b4b4:
Te6edf3lxmTff7b72.Td2a8ffmethod Tff7b72= Te6edf3containerTb4b4b4[Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4]
Tff7b72return Te6edf3lxm
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not unpack LXMessage from file. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────